// File: delay_us.c
#include "delay_us.h"

/**
  * @brief  DWT延时模块初始化
  * @note   必须在主时钟配置完成后调用
  */
void HAL_DelayUs_Init(void)
{
    // 使能DWT访问权限
    DEMCR_REG |= (1 << 24);
    
    // 重置周期计数器并启用
    DWT_CYCCNT_REG = 0;
    DWT_CTRL_REG |= (1 << 0);
}

/**
  * @brief  微秒级高精度延时
  * @param  microseconds: 需要延时的微秒数 (1~1000000)
  */
void HAL_DelayUs(uint32_t microseconds)
{
    uint32_t start_tick = DWT_CYCCNT_REG;
    uint32_t delay_ticks = microseconds * (SystemCoreClock / 1000000);
    
    // 使用无符号数减法处理计数器溢出
    while((DWT_CYCCNT_REG - start_tick) < delay_ticks)
    {
        __ASM volatile ("nop"); // 插入空操作防止编译器优化
    }
}